package com.zyl.javabasic.ThreadLocal;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author zyl
 * @Description
 * @since 2025/6/23 20:48
 */

public class DateFormatExample {
    // 非线程安全的SimpleDateFormat
    private static final SimpleDateFormat unsafeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    // 线程安全的ThreadLocal方案
    private static final ThreadLocal<SimpleDateFormat> safeFormat =
            ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);

        /**
         * SimpleDateFormat 的内部状态（如 Calendar 对象）在多线程环境下会被竞争修改，导致解析时读取到不完整或错误的数据。
         * 例如，一个线程可能正在修改内部状态，而另一个线程读取了部分数据，从而解析失败，抛出 NumberFormatException（因为解析器期望的数字字符串为空或格式错误）
         */
        // 不安全的使用方式(可能抛出异常)
//         for (int i = 0; i < 10; i++) {
//             executor.execute(() -> {
//                 try {
//                     System.out.println(unsafeFormat.parse("2023-01-01 12:00:00"));
//                 } catch (ParseException e) {
//                     e.printStackTrace();
//                 }
//             });
//         }

        // 安全的使用方式
        for (int i = 0; i < 10; i++) {
            executor.execute(() -> {
                try {
                    SimpleDateFormat format = safeFormat.get();
                    Date date = format.parse("2023-01-01 12:00:00");
                    System.out.println(Thread.currentThread().getName() + ": " + date);
                } catch (ParseException e) {
                    e.printStackTrace();
                } finally {
                    safeFormat.remove(); // 清理
                }
            });
        }

        executor.shutdown();
    }
}
